#include "FreeRTOS_cfg.h"
#include <stdio.h>
#include "led.h"
#include "key.h"
#include "esptim.h"
#include "gptim.h"
#include "pwm.h"
#include "oled.h"
#include "uart.h"
#include "exit.h"
#include "myrtc.h"
#include "adc1.h"

TaskHandle_t Task1Task_Handler; //任务1句柄
TaskHandle_t Task2Task_Handler; //任务2句柄
TaskHandle_t Task3Task_Handler; //任务3句柄

void task1(void *pvParameters); //任务1函数
void task2(void *pvParameters); //任务2函数
void task3(void *pvParameters); //任务3函数

static portMUX_TYPE my_spinlock = portMUX_INITIALIZER_UNLOCKED;

void task1(void *pvParameters)
{
    pvParameters = pvParameters;
    
    uint8_t len = 0;
    u8 data[200] = {0};
    char buf[40];
    u32 value;
    
    while (1)
    {
        uart_get_buffered_data_len(UART_NUM_1, (size_t*) &len);                           /* 获取环形缓冲区数据长度 */
        if (len > 0)                                                                    /* 判断数据长度 */
        {
            memset(data, 0, sizeof(data));                                               /* 对缓冲区清零 */
            uart_read_bytes(UART_NUM_1, data, len, 100);                                  /* 读数据 */
            uart_write_bytes(UART_NUM_1, (const char*)data, strlen((const char*)data));   /* 写数据 */
        }
        vTaskDelay(10);
        rtc_get_time();
        sprintf(buf, "Time:%02d:%02d:%02d\r\n", calendar.hour, calendar.min, calendar.sec);
        uart_write_bytes(UART_NUM_1, buf, strlen(buf));
    
        sprintf(buf, "Date:%04d-%02d-%02d\r\n", calendar.year, calendar.month, calendar.date);
        uart_write_bytes(UART_NUM_1, buf, strlen(buf));

        
        value=adc_get_result_average(ADC1_CHANNEL_3,5);
        sprintf(buf, "%u\r\n", value);
        uart_write_bytes(UART_NUM_1, buf, strlen(buf));
    }
}


void task2(void *pvParameters)
{
    pvParameters = pvParameters;
    
    while (1)
    {
        taskENTER_CRITICAL(&my_spinlock);

        taskEXIT_CRITICAL(&my_spinlock);
        vTaskDelay(1000);
    }
}


void task3(void *pvParameters)
{
    pvParameters = pvParameters;

    while (1)
    {
        vTaskDelay(1000);
    }
}




void freertos_start()
{
    /* 创建任务1 */
    xTaskCreatePinnedToCore((TaskFunction_t )task1,                 /* 任务函数 */
                            (const char*    )"task1",               /* 任务名称 */
                            (uint16_t       )5*1024,        /* 任务堆栈大小 */
                            (void*          )NULL,                  /* 传入给任务函数的参数 */
                            (UBaseType_t    )1,            /* 任务优先级 */
                            (TaskHandle_t*  )&Task1Task_Handler,    /* 任务句柄 */
                            (BaseType_t     )0);                   /* 该任务哪个内核运行 */
    /* 创建任务2 */
    xTaskCreatePinnedToCore((TaskFunction_t )task2,                 /* 任务函数 */
                            (const char*    )"task2",               /* 任务名称 */
                            (uint16_t       )5*1024,        /* 任务堆栈大小 */
                            (void*          )NULL,                  /* 传入给任务函数的参数 */
                            (UBaseType_t    )2,            /* 任务优先级 */
                            (TaskHandle_t*  )&Task2Task_Handler,    /* 任务句柄 */
                            (BaseType_t     )0);                   /* 该任务哪个内核运行 */

    /* 创建任务3 */
    xTaskCreatePinnedToCore((TaskFunction_t )task3,                 /* 任务函数 */
                            (const char*    )"task3",               /* 任务名称 */
                            (uint16_t       )5*1024,        /* 任务堆栈大小 */
                            (void*          )NULL,                  /* 传入给任务函数的参数 */
                            (UBaseType_t    )3,            /* 任务优先级 */
                            (TaskHandle_t*  )&Task3Task_Handler,    /* 任务句柄 */
                            (BaseType_t     )0); 
}